package testSocketUDP.viejo;

import java.io.IOException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import utiles.IDatosEquipoRemoto;
import utiles.Numeros;
import utiles.Ip;
import actualizador.Datagrama;
import actualizador.DatoEquipo;
import actualizador.Mensaje;
import actualizador.manejoErrores.ErrorBusquedaServidorException;

public class TestClienteBroadcast extends Thread{
	private int nroMensaje= 0;
	private String ipServidor= "", ipCliente;
	private int vecesReintento= 10, intentos= 0;
	private static int MIN_RND= 1000, MAX_RND= 5000, TIMEOUT= 4000;
	public boolean continuar= true;
	private IDatosEquipoRemoto datoCliente;

	public TestClienteBroadcast(String ipCliente) {
		if(ipCliente!=null)
			this.ipCliente= ipCliente;
		else{
			try {
				this.ipCliente= Ip.getIpV4();

			} catch (UnknownHostException e1) {
				e1.printStackTrace();
			}
		}
		
		this.datoCliente= new DatoEquipo(this.ipCliente);
	}

	public void run() {

		System.out.println("Busqueda de la ip del servidor via Broadcast. Ip del cliente: "+ipCliente);

		Datagrama dg= new Datagrama();
		int tiempoEspera;
		double unSegundo= 1000.0;
		while(continuar){
			Mensaje m= new Mensaje(nroMensaje++, datoCliente, "Hola");

			System.out.println("Nro de mensaje: "+nroMensaje+". Mensaje a enviar: "+m);
			try {
				if(ipServidor.isEmpty())
					dg.enviarMensajeBroadcast(m);
				else
					dg.enviarMensaje(ipServidor, m);

				m= (Mensaje) dg.recibirMensaje(TIMEOUT);
				ipServidor= m.getDatosEquipoRemoto().getIp();

				System.out.println("Respuesta recibida: "+m+", desde servidor cuya ip es: "+ipServidor);

				tiempoEspera= Numeros.randomInteger(MIN_RND, MAX_RND);
				System.out.println("Tiempo de espera: "+Numeros.redondear((tiempoEspera/unSegundo),2)+" segundos");
				Thread.currentThread();
				Thread.sleep(tiempoEspera);
			} catch (InterruptedException ie){
				ie.printStackTrace();
			} catch (SocketTimeoutException ste){
				ste.printStackTrace();
				intentos++;

				if(intentos == vecesReintento){
					ipServidor= "";
					intentos= 0;
					continuar= false;
				}
				System.err.println("Intento erroneo nro: "+intentos);
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (SocketException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} finally {
				dg.cerrarDatagrama();
			}
		}

		if(!hayIpServidor()){
			throw new ErrorBusquedaServidorException(vecesReintento);
		}else{
			synchronized(this){
				notify();
			}
		}
	}

	public String getIpServidor() {
		return ipServidor;
	}

	public boolean hayIpServidor(){
		return ipServidor.isEmpty();
	}

	public void detener(){
		continuar= false;
	}
	
	public static void main(String[] args) {
		(new TestClienteBroadcast(null)).start();
	}
}
